import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { Logger, ValidationPipe } from '@nestjs/common';
import { ResponseInterceptor } from './common/interceptor/responseInterceptor';
import { ExceptionInterceptor } from './common/interceptor/exceptionInterceptor';
import * as session from 'express-session';
import { CacheService } from "./task/cacheService.service";

(async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  // 创建Logger实例
  const logger = new Logger('BootstrapProcess');
  // 注入响应拦截器
  app.useGlobalInterceptors(new ResponseInterceptor());
  // 注入异常拦截器
  app.useGlobalFilters(new ExceptionInterceptor());
  app.enableCors();
  app.useGlobalPipes(
    new ValidationPipe({
      // 开启字段白名单验证 可以剔除掉上传对象中的不在DTO中的字段
      whitelist: true,
      // 当不在请求对象中包含不在白名单的字段时拒绝这个请求并提示 与 whitelist 组合使用
      forbidNonWhitelisted: true,
      // 开启DTO转换 使的 请求对象 与 DTO 匹配时的instanceof 为 true
      //  如果@Param('id') id:number，transform配置将试图把id转化成number，而不是经由网络后的字符串id
      transform: true,
      transformOptions: {
        // 开启全局隐式转换 可以省略@Type修饰符 隐式指定所有DTO都使用Type修饰符
        enableImplicitConversion: true,
      },
    }),
  );
  // 注入session插件 使用场景：验证码
  app.use(session({
    secret: 'yejie', // 加盐
    rolling: true, // 每次请求强行设置cookie时 将重置cookie过期时间
    name: "connect.sid", // 生成客户端cookie的名字 默认为 connect.sid
    // 设置返回到前端key的属性，默认值为{path:'/',httpOnly:true,secure:false,maxAge:null}
    cookie: {
      path:'/',
      httpOnly:true,
      secure:false,
      maxAge:null
    }
  }))

  await app.listen(process.env.APP_PORT)

  logger.log('==============================================================');
  logger.log('Nest application successfully started on port:' + process.env.APP_PORT);
  logger.log('Nest environment:' + process.env.NODE_ENV);
  logger.log('==============================================================');

  // 初始化redis文章浏览量数据
  const cacheService = app.get(CacheService);
  await cacheService.initArticleViews()
})()